﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace Mantenimiento.Negocio
{
    [Serializable]
    public class Vehiculo
    {
        #region CAMPOS
        private string _matricula;
        private int _idModelo;
        private int _idExplotacion;
        private int _kilometros;
        private int _horas;
        private bool _controlPorHoras;
        private bool bNueva;
        private Explotacion oExplot;
        private Modelo oModelo;
        private int _valorRevision;
        private List<Revision> _listaRevisiones;
        private int _lastRevision;
        private string _textoRestante;
        private string _imagenIcono;
        private string _textoRestanteImagen;
        private DateTime _fexUltimaMod;
        private string _textoSinActualizar;
        #endregion

        #region PROPIEDADES
        public string Matricula
        {
            get { return _matricula; }
            set { _matricula = value; }
        }
        public int IdModelo
        {
            get { return _idModelo; }
            set { _idModelo = value; }
        }
        public int IdExplotacion
        {
            get { return _idExplotacion; }
            set { _idExplotacion = value; }
        }
        public int Kilometros
        {
            get { return _kilometros; }
            set { _kilometros = value; }
        }
        public int Horas
        {
            get { return _horas; }
            set { _horas = value; }
        }
        public bool ControlPorHoras
        {
            get { return _controlPorHoras; }
            set { _controlPorHoras = value; }
        }
        public Explotacion OExplot
        {
            get { return oExplot; }
            set { oExplot = value; }
        }
        public Modelo OModelo
        {
            get { return oModelo; }
            set { oModelo = value; }
        }
        public int ValorRevision
        {
            get { return _valorRevision; }
            set { _valorRevision = value; }
        }
        public List<Revision> ListaRevisiones
        {
            get { return _listaRevisiones; }
            set { _listaRevisiones = value; }
        }
        public int LastRevision
        {
            get { return _lastRevision; }
            set { _lastRevision = value; }
        }
        public string ImagenIcono
        {
            get { return _imagenIcono; }
            set { _imagenIcono = value; }
        }
        public string TextoRestante
        {
            get { return _textoRestante; }
            set { _textoRestante = value; }
        }
        public string TextoRestanteImagen
        {
            get { return _textoRestanteImagen; }
            set { _textoRestanteImagen = value; }
        }
        public string TextoSinActualizar
        {
            get { return _textoSinActualizar; }
            set { _textoSinActualizar = value; }
        }
        public DateTime FexUltimaMod
        {
            get { return _fexUltimaMod; }
            set { _fexUltimaMod = value; }
        }
        #endregion

        #region CONSTRUCTOR
        public Vehiculo()
        {
            _matricula = string.Empty;
            _kilometros = 0;
            _horas = 0;
            _controlPorHoras = false;
            bNueva = true;
        }
        public Vehiculo(DataRow dr)
        {
            _matricula = dr["Matricula"].ToString();
            _idModelo = int.Parse(dr["IdModelo"].ToString());
            _idExplotacion = int.Parse(dr["IdExplotacion"].ToString());
            _kilometros = int.Parse(dr["Kilometros"].ToString());
            _horas =  int.Parse(dr["Horas"].ToString());
            _controlPorHoras = (bool)dr["ControlPorHoras"];
            _fexUltimaMod = (DateTime)dr["UltimaMod"];
            TimeSpan ts = DateTime.Now - _fexUltimaMod;
            if (ts.TotalDays > 30)
            {
                string sAlt = "Lleva más de 30 días sin actualizar";
                string sImagen = "icono_alert.png";
                _textoSinActualizar = String.Format("<img alt=\"{0}\" src=\"Imagenes\\{1}\"", sAlt, sImagen);
            }
            else
            {
                _textoSinActualizar = "";
            }
            bNueva = false;
            try
            {
                oExplot = Explotacion.obtener(IdExplotacion);
                oModelo = Modelo.obtener(IdModelo);
                _listaRevisiones = Revision.obtenerxmatricula(_matricula);
                calcularValor();
            }
            catch (Exception ex)
            {
            }
        }

        private void calcularValor()
        {
            int valorKilometros = 0;
            int valorHoras = 0;
            if (_listaRevisiones.Count > 0)
            {
                valorKilometros = _kilometros - _listaRevisiones.OrderByDescending(c => c.Fecha).ToList()[0].Kilometros;
                valorHoras = _horas - _listaRevisiones.OrderByDescending(c => c.Fecha).ToList()[0].Horas;
                _lastRevision = _listaRevisiones.OrderByDescending(c => c.Fecha).ToList()[_listaRevisiones.Count-1].NRevision;
            }
            else
            {
                valorKilometros = _kilometros;
                valorHoras = _horas;
                _lastRevision = 0;
            }
            if (_controlPorHoras)
            {
                _valorRevision = (500 - valorHoras)*30;
                int iValorRestante = 500 - valorHoras;
                _textoRestante = string.Format("Faltan {0} horas para la siguiente revisión.", iValorRestante);
            }
            else
            {
                _valorRevision = 15000 - valorKilometros;
                int iValorRestante = 15000 - valorKilometros;
                _textoRestante = string.Format("Faltan {0} kilómetros para la siguiente revisión.", iValorRestante);
            }
            string sImagen = "";
            if (_valorRevision < 0)
                sImagen = "icono_red.png";
            else
            {
                if ((_valorRevision > 0) && (_valorRevision < 2000))
                    sImagen = "icono_yellow.png";
                else
                    sImagen = "icono_green.png";
            }
            _textoRestanteImagen = string.Format("<img src=\"Imagenes\\{0}\" alt=\"{1}\" />", sImagen, _textoRestante);
        }
        #endregion

        #region METODOS PROPIOS
        public void guardar()
        {
            if (_matricula != string.Empty)
            {
                if (bNueva)
                {
                    // SI ES UN REGISTRO NUEVO, INSERTAMOS EN LA BBDD
                    CAD.Vehiculo.insertar(_matricula, _idModelo, _idExplotacion, _kilometros, _horas, _controlPorHoras, DateTime.Now);
                }
                else
                {
                    // SI EL REGISTRO EXISTIA, LO MODIFICAMOS
                    CAD.Vehiculo.modificar(_matricula, _idModelo, _idExplotacion, _kilometros, _horas, _controlPorHoras, DateTime.Now);
                }
            }
        }
        public void eliminar()
        {
            if (_matricula != string.Empty)
            {
                CAD.Vehiculo.eliminar(_matricula);
            }
        }
        #endregion

        #region METODOS ESTATICOS DE CLASE
        public static List<Vehiculo> obtenerTodos()
        {
            List<Vehiculo> lista = new List<Vehiculo>();
            DataTable dt = CAD.Vehiculo.buscar();
            foreach (DataRow dr in dt.Rows)
            {
                try
                {
                    lista.Add(new Vehiculo(dr));
                }
                catch (Exception ex)
                {
                }
            }
            return lista;
        }
        public static Vehiculo obtener(string pMatricula)
        {
            try
            {
                DataTable dt = CAD.Vehiculo.buscar(pMatricula);
                if (dt.Rows.Count == 1)
                {
                    Vehiculo m = new Vehiculo(dt.Rows[0]);
                    return m;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                return null;
            }
        }
        #endregion
    }
}
